package main

import (
	"encoding/json"
	"fmt"
	"io/ioutil"
	"os"
)

/*
学生信息系统添加。无限次数添加和查询，按q退出，信息固化到磁盘
1、添加学生信息.
	判断此用户名有没有添加过
	没有用户，提示输入学生信息 （姓名，年龄，性别，住址）

2、查询学生信息.
	按名字查询
*/

/*
json : 轻量级的数据交换格式

	字符串
*/
func main() {
	filename := "students.json" // 定义文件名
	student_table, err := loadStudentsFromFile(filename)
	if err != nil {
		fmt.Printf("加载学生信息失败: %v\n", err)
		// 可以选择退出或继续，这里选择继续
		student_table = make(map[string]map[string]string)
	}

	for {
		fmt.Println("请选择你的操作：\n按1、添加学生信息\n按2、查询学生信息\n按q退出系统")
		var input string
		fmt.Scanln(&input)
		switch input {
		case "1":
			var name string
			var age string
			var sex string
			var home string
			fmt.Println("请输入你要添加的学生信息：\n学生的姓名为：")
			fmt.Scanln(&name)
			fmt.Println("学生的年龄为：")
			fmt.Scanln(&age)
			fmt.Println("学生的性别为：fmale or male")
			fmt.Scanln(&sex)
			fmt.Println("学生的住址为：")
			fmt.Scanln(&home)
			add_stu(name, age, sex, home, student_table)
		case "2":
			var name string
			fmt.Println("请输入你要查询的学生信息：")
			fmt.Scanln(&name)
			select_stu(name, student_table)
		case "q":
			if err := saveStudentsToFile(student_table, filename); err != nil {
				fmt.Printf("保存学生信息失败: %v\n", err)
			} else {
				fmt.Println("感谢使用")
				break
			}
		default:
			fmt.Println("请输入正确的选择")
		}
	}
	defer func() {
		if err := saveStudentsToFile(student_table, filename); err != nil {
			fmt.Printf("保存学生信息失败: %v\n", err)
		}
	}()
}
func add_stu(name string, age string, sex string, home string, student_table map[string]map[string]string) {
	_, ok := student_table[name]
	if ok {
		fmt.Println("学生信息已存在，请勿重复添加")
	} else {
		student := map[string]string{}
		student["姓名"] = name
		student["年龄"] = age
		student["性别"] = sex
		student["住址"] = home
		student_table[name] = student
	}
}
func select_stu(name string, student_table map[string]map[string]string) {
	value, ok := student_table[name]
	if ok {
		fmt.Println(value)
	} else {
		fmt.Println("没有该学生信息")
	}
}
func loadStudentsFromFile(filename string) (map[string]map[string]string, error) {
	student_table := make(map[string]map[string]string)
	file, err := os.Open(filename)
	if err != nil {
		if os.IsNotExist(err) {
			// 文件不存在，返回空的student_table和nil错误
			return student_table, nil
		}
		return nil, err
	}
	defer file.Close()

	data, err := ioutil.ReadAll(file)
	if err != nil {
		return nil, err
	}

	err = json.Unmarshal(data, &student_table)
	if err != nil {
		return nil, err
	}

	return student_table, nil
}
func saveStudentsToFile(student_table map[string]map[string]string, filename string) error {
	file, err := os.Create(filename)
	if err != nil {
		return err
	}
	defer file.Close()

	encoder := json.NewEncoder(file)
	err = encoder.Encode(student_table)
	if err != nil {
		return err
	}
	fmt.Println("学生信息已保存到文件")
	return nil
}
